package com.shilei.proxy.dynamicProxy;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @description:  动态代理
 *          问题：如果有stop方法需要代理。。。
 *
 *          如果想让LogProxy可以重用，不仅可以代理Tank，还可以代理任何其他可以代理的类型Object
 *          (毕竟日志记录，时间计算时很多方法都需要的东西)这是需要怎么做？
 *          分离代理行为与被代理对象
 *          使用JDK 动态代理
 * @author: 81271
 * @date: 2020-04-18 18:38
 */
public class Tank implements Moveable {

    @Override
    public void move() {
        System.out.println("Tank running kakakakakakakaka");
    }
}



interface Moveable {
    void move();
}

class Main {
    public static void main(String[] args) {
        Tank tank = new Tank();
        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
//        System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles","true");

        //Proxy动态生成代理  其中 运用了asm类库  用来操作二进制码的 修改java二进制文件
        Moveable moveable = (Moveable)Proxy.newProxyInstance(Tank.class.getClassLoader(),
                new Class[]{Moveable.class}, new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("method:" + method.getName() + "   start");
                        Object invoke = method.invoke(tank, args);
                        System.out.println("method:" + method.getName() + "   end");
                        return invoke;
                    }
                });

        moveable.move();
    }
}
